<?php

namespace App\Http\Controllers\Api;

use App\Exceptions\MyValidateException;
use App\Http\Controllers\Controller;
use App\Models\Fang;
use App\Models\Fangattr;
use App\Models\FangCount;
use App\Models\Fangrent;
use App\Models\Renting;
use Illuminate\Http\Request;

class FangController extends Controller
{
    //推荐房源
    public function recommend(Request $request)
    {
        $data = Fang::select(['id', 'fang_pic'])->where('is_recommend', '1')->limit(6)->get();
        return ['code' => 0, 'msg' => '成功', 'data' => $data];
    }

    //房源属性
    public function attr(Request $request)
    {
        //查询属性对应字段名称
        $field_name = $request->get('field_name');
        //获取所有房源属性
        $data = Fangattr::all()->toArray();
        //递归 层级嵌套
        $data = subTreeName($data);
        //返回数据
        return ['code' => 0, 'msg' => '成功', 'data' => $data[$field_name]];
    }

    //房源列表 分页
    public function index(Request $request)
    {
        //房源属性的搜索条件，如果没有使用房源属性来搜索，则为空数组
        $arrwhere=json_decode($request->get('attrField'),true);
        $where=[];
        if(count($arrwhere)>0){
            $where[$arrwhere['field']]=$arrwhere['value'];
        }
        //获取数据
        $data = Fang::select([
            'id',
            'fang_pic',
            'fang_name',
            'fang_rent',
            'fang_floor',
            'fang_direction',
            'fang_shi',
            'fang_ting',
            'fang_wei',
            'fang_rent_class',
            'fang_build_area',
            'fang_status'
        ])->where($where)->paginate(config('app.pagesize'));
        return ['code' => 0, 'msg' => '成功', 'data' => $data];
    }

    //房源详情
    public function show(int $fang)
    {
        $data = Fang::with('owner')->where('id', $fang)->first();
        return ['code' => 0, 'msg' => '成功', 'data' => $data];
    }

    //看房记录添加
    public function rec(Request $request)
    {
        //参数验证
        try {
            $data = $this->validate($request, [
                'rid' => 'required',
                'fang_id' => 'required'
            ]);
            //判断当前是否存在记录，不存在则添加，存在则修改
            $model = FangCount::where($data)->first();
            $data['click'] = 1;
            if (!$model) {
                //没有记录，添加
                $model = FangCount::create($data);
            } else {
                //记录已经存在，自增长
                $model->increment('click');
            }
            return ['status' => 0, 'msg' => '成功', 'data' => $model];
        } catch (\Exception $exception) {
            throw new MyValidateException('验证错误', 1002);
        }
    }

    //看房记录列表
    public function recList(Request $request){
        $rid=$request->get('rid');
        $model=Renting::find($rid);
        $data=$model->recs()->paginate(config('app.pagesize'));
        return ['status'=>0,'msg'=>'成功','data'=>$data];
    }

    //个人已租房源列表
    public function rented(Request $request){
        //验证
        try{
            $data=$this->validate($request,[
                'rent_id'=>'required|numeric'
            ]);
            $ret=Fangrent::with('fang')->where($data)->orderBy('edt','desc')->paginate(config('app.pagesize'));
            return ['status'=>0,'msg'=>'成功','data'=>$ret];
        }catch (\Exception $exception){
            throw new MyValidateException('验证有误',1002);
        }
    }

    //es 模糊搜索
    public function search(Request $request){
        // 搜索关键词
        $kw = $request->get('kw');
        // 调用es对象
        $hosts = config('es.host');
        // 实例化es对象
        $client = \Elasticsearch\ClientBuilder::create()->setHosts($hosts)->build();
        // 搜索条件数据源
        $params = [
            // 索引名称
            'index' => 'zfw',
            'body' => [
                'query' => [
                    'match' => [
                        // 查询字段名称
                        'desn' => [
                            'query' => $kw
                        ]
                    ]
                ]
            ]
        ];
        // 调用api完成搜索工作，得到搜索结中的_id，此id为数据表中房源id，用些ID来完成对应的数据的获取
        $ret = $client->search($params);
        // es进行查询
        // 1、先通过es完成搜索，得到对应的数据表中的id
        // 2、用es返回的数据表id，查询数据库，返回数据
        // 判断一下，是否查询到记录
        if (count($ret['hits']['hits']) > 0) {
            // 得到二维数组中，指定的下标值，返回一个一维索引数组，如果需要分页，则可以使用
            // array_chunk — 将一个数组分割成多个
            $ids = array_column($ret['hits']['hits'], '_id');
            // 获取数据
            $data = Fang::select([
                'id',
                'fang_pic',
                'fang_name',
                'fang_rent',
                'fang_floor',
                'fang_shi',
                'fang_ting',
                'fang_wei',
                'fang_rent_class',
                'fang_build_area',
                'fang_status'
            ])->whereIn('id', $ids)->paginate(config('app.pagesize'));
            // 返回数据
            return ['status' => 0, 'msg' => '成功', 'data' => $data];
        }
        return ['status' => 0, 'msg' => '成功', 'data' => []];
    }
}
